/**Producer==>Exchange==>Queue==>Consumer
 * 共6种模式：简单模式，work模式，Publish/Subscribe发布与订阅模式，Routing路由模式，Topic主题模式，RPC远程调用模式（不太算MQ）
 *
 * Producer步骤：
 * 1）创建连接工厂：ConnectionFactory
 *    设置RabbitMQ服务主机地址(默认localhost)、服务端口(默认5672)、虚拟主机名字(默认/)、用户连接名(默认guest)、连接密码(默认guest)
 * 2）创建连接：Connection
 * 3）创建信道：Channel，connection.createChannel
 * 4.1）声明交换器：Exchange，channel.exchangeDeclare（简单模式和工作模式本步骤可省略，底层使用默认交换机）
 * 4.2）声明队列：Queue，指定到哪个队列获取消息，channel.queueDeclare
 * 4.3) 绑定交换器和队列：channel.queueBind（简单模式和工作模式本步骤可省略，底层会将队列绑定到默认的交换机）
 * 5）创建消息：Message
 * 6）消息发送：channel.basicPublish
 * 7）关闭资源：channel.close();connection.close();
 *
 * Consumer步骤
 * 1）创建连接工厂：ConnectionFactory
 *    设置RabbitMQ服务主机地址(默认localhost)、服务端口(默认5672)、虚拟主机名字(默认/)、用户连接名(默认guest)、连接密码(默认guest)
 * 2）创建连接：Connection
 * 3）创建信道：Channel，connection.createChannel()
 * 4）声明队列：Queue，指定到哪个队列获取消息
 * 5) 创建消费者：DefaultConsumer，在其中重写handleDelivery方法进行消息处理
 * 6）消息监听：channel.basicConsume
 * 7）不建议关闭资源，而是一直监听消息
 */
package com.example.rabbitMQ;

public class Main {
    public static void main(String[] args) {
//        //基础演示
//        BasicDemo.basicConsume();
//        BasicDemo.basicProduce();

//        BasicDemo.workqueueProduce();
//        new Thread(()-> BasicDemo.workqueueConsume1()).start();
//        new Thread(()-> BasicDemo.workqueueConsume2()).start();
//
        //交换器演示

        new Thread(ExchangeDemo::directConsume1).start();
        new Thread(ExchangeDemo::directConsume2).start();
        ExchangeDemo.directProduce();
//
//        ExchangeDemo.topicProduce();
//        new Thread(()-> ExchangeDemo.topicConsume1()).start();
//        new Thread(()-> ExchangeDemo.topicConsume2()).start();
//
//
//        ExchangeDemo.fanoutProduce();
//        new Thread(()-> ExchangeDemo.fanoutConsume1()).start();
//        new Thread(()-> ExchangeDemo.fanoutConsume2()).start();

          //高级演示
//        AdvancedDemo.txcfmConsumer();
//        AdvancedDemo.transactionProducer();
//        new Thread(()->AdvancedDemo.confirmProducer()).start();

//        new Thread(()-> AdvancedDemo.ackConsumer()).start();
//        AdvancedDemo.ackProducer();

//        AdvancedDemo.limitFlowConsumer();
//        AdvancedDemo.limitFlowProducer();

//        AdvancedDemo.durableConsumer();
//        AdvancedDemo.durableProducer();

//        AdvancedDemo.deadConsumer();
//        AdvancedDemo.normalConsumer();
//        AdvancedDemo.deadProducer();
//
//        AdvancedDemo.delayConsumer();
//        AdvancedDemo.delayProducer();

    }
}
